Skip to content

fix: settlement overrides for upto in typescript sdk#1913

Merged
CarsonRoscoe merged 1 commit intox402-foundation:mainfrom
coinbase:fix/upto-settlement-overrides
Apr 2, 2026
Merged

fix: settlement overrides for upto in typescript sdk#1913
CarsonRoscoe merged 1 commit intox402-foundation:mainfrom
coinbase:fix/upto-settlement-overrides

Conversation

@CarsonRoscoe
Copy link
Copy Markdown
Contributor

@CarsonRoscoe CarsonRoscoe commented Apr 2, 2026

Description

Fix a bug with the Typescript SDK where upto could not properly have its amount/price values overridden due to header case sensitivity issues

Tests

Manually tested via examples

Checklist

  • I have formatted and linted my code
  • All new and existing tests pass
  • My commits are signed (required for merge)

@github-actions github-actions Bot added typescript sdk Changes to core v2 packages labels Apr 2, 2026
@CarsonRoscoe CarsonRoscoe merged commit 98bcb65 into x402-foundation:main Apr 2, 2026
14 checks passed
ethanoroshiba added a commit to coinbase/x402 that referenced this pull request Apr 21, 2026
* docs: add initial x402 foundation charter (x402-foundation#1911)

* fix: settlement overrides for upto in typescript sdk (x402-foundation#1913)

* feat: refactor coinbase/x402 references to x402-foundation/x402 (x402-foundation#1912)

* feat: refactor coinbase/x402 references to x402-foundation/x402

* fix: format

* chore: changeset fragments for typescript, python and go

* chore: version typescript, python and go packages (x402-foundation#1915)

* chore: version typescript packages

* chore: version python package

* chore: version go package

* feat: updated pypi workflow to use trusted publishing (x402-foundation#1916)

* docs(bazaar): clarify EXTENSION-RESPONSES header applies to verify and settle (x402-foundation#1922)

Made-with: Cursor

* feat: add self-facilitation example (x402-foundation#1942)

* add self-facilitation example

* fix: regenerate examples/typescript lockfile against public npm registry

Lockfile had tarball URLs pointing to internal Coinbase Artifactory, causing
pnpm install to fail with ENOTFOUND in CI where that host is unreachable.

* feat: added upto to docs (x402-foundation#1961)

* feat: add upto readme and client examples (x402-foundation#1963)

* chore(extensions): migrate to @signinwithethereum/siwe (x402-foundation#1917)

* Migrate to @signinwithethereum/siwe

Migrate the SIWE dependency to the Ethereum Identity Foundation package. package.json now depends on @signinwithethereum/siwe; evm.ts import was updated to import SiweMessage from the new package. Added a changeset describing the migration. (pnpm lock updated to reflect the dependency change.)

* Add siwe v4.1.0 entries to pnpm-lock

Update examples/typescript/pnpm-lock.yaml to add @signinwithethereum/siwe@4.1.0 and @signinwithethereum/siwe-parser@4.1.0. Adds package resolutions and snapshot entries, registers peerDependencies (ethers and viem marked optional), and removes the older siwe@2.3.2 entry in the importer. This pins the example project to the siwe v4 parser/runtime and records its dependency graph in the lockfile.

* feat(specs): add Keeta exact scheme (x402-foundation#1575)

* feat(specs): add Keeta exact scheme

* feat(schemes/keeta): add transaction simulation to verification step

This adds a few cheap checks to simulate the transaction and catch
invalid blocks early on to prevent the server from doing expensive work
unnecessarily.

* Add Echo framework documentation (x402-foundation#1783)

* Update docs/sdk-features.md

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* add fastify

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
Co-authored-by: Philippe d'Argent <p.dargent@cern.ch>

* improve defaultAsset docs (x402-foundation#1983)

* feat(bazaar): add MCP resource type support to Go SDK (x402-foundation#1967)

* feat(bazaar): add MCP resource type support to Go SDK

Add MCP tool discovery extensions to the bazaar package, achieving
parity with the TypeScript and Python SDKs. Servers can now declare
MCP tool discovery extensions alongside HTTP resources, and facilitators
can detect and extract them from payment payloads.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: gofmt formatting and gocritic if-else-chain lint

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(bazaar): transport enum, doc examples, inline helper, add negative tests

- Fix transport schema enum to include both valid values (streamable-http,
  sse) instead of only the provided value, matching TypeScript SDK behavior
- Fix doc.go examples to use bazaar.BAZAAR.Key() instead of bazaar.BAZAAR
- Inline createMcpDiscoveryExtension into DeclareMcpDiscoveryExtension
- Add negative validation tests for wrong type and empty toolName
- Add edge case tests for whitespace-only toolName and invalid transport

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(mcp): wire extensions into PaymentWrapper 402 response

Add Extensions field to PaymentWrapperConfig and pass it through to the
PaymentRequired struct in 402 responses. This brings the MCP payment
wrapper to parity with the HTTP middleware's RouteConfig.Extensions
support, enabling bazaar discovery extensions in MCP tool responses.

- Add Extensions map to PaymentWrapperConfig (types.go)
- Set extensions in paymentRequiredResult (server.go)
- Add unit tests for extensions present/absent in 402 (server_test.go)
- Declare bazaar MCP extension in E2E server (main.go)
- Add bazaar extension integration test (mcp_evm_test.go)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(mcp): wire TS extensions into 402 responses + Go integration tests

Add extensions support to the TS MCP PaymentWrapperConfig and pass it
through to createPaymentRequiredResponse so bazaar discovery metadata
appears in 402 responses. Wire the E2E server with declareDiscoveryExtension
for the get_weather tool. Add Go mocked-transport integration tests
(5 cases) covering the full client↔server payment flow to match TS
mcp-payment-flow.test.ts coverage.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: prettier formatting in MCP test files

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(bazaar): address PR review feedback from @CarsonRoscoe

- Use strings.TrimSpace for toolName validation to reject whitespace-only names
- Allow custom transport values through schema validation (only enum for known transports)
- Fix whitespace toolName test to assert error instead of success
- Remove conditional guard in TS bazaar extension test so assertions always run

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(bazaar): allow custom transport values in TS to match Go behavior

Widen transport type from "streamable-http" | "sse" to string, and only
apply enum constraint in schema for known transport values. This matches
the Go-side fix so custom transports pass validation in both languages.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>

* Ecosystem page changes (x402-foundation#1992)

* feat(avm): Add Algorand (AVM) blockchain exact spec implementation and networks support for Typescript (x402-foundation#1560)

* Migrate all code from branch-algorand-v2-typescript-algokit

* Update format and lint pass on core and examples

* Reformat template files

* Update: Coinbase review changes applied

* Fix Paywall builder pattern

* Update: Reverted e2e/legacy, Remove: src/exact/v1 and src/v1

* Add Faucets URLs to AVM README

* Optimizing and shrinking PR

* Remove dead import

* Add optimization changes related unit tests

* Update coinbase review changes applied

* Update avm e2e, rebased to latest, linted and formatted

* Fix avm template format

* Remove python and Go AVM templates, Made AVM optional to facilitator and Add SERVER_ADDRESS

* Lint and format

* Update: made AVM optional in proxy.ts

* Rebased and Replayed some commits

* Reset e2e pnpm-lock.yaml

* Replayed correct updated lockfiles

* Reverted accidentally overwritten files during rebase replay

* Revert accidental overwritten files in examples

* fix(evm): restore Mezo Testnet default asset dropped in v2.9.0 refactor (x402-foundation#1920)

* docs(examples): clarify facilitator signer roles (x402-foundation#1937)

* fix(paywall): read token name from payment requirements instead of hardcoding USDC (x402-foundation#1973)

The EVM paywall hardcodes "USDC" as the token label in all display
text. The payment requirements already carry the token name in
extra.name (populated by the server from the default asset registry),
but the paywall ignores it.

Read extra.name from the first payment requirement and use it for
all user-facing token text. Falls back to "USDC" when extra.name
is absent (backward compatible with EIP-3009 tokens).

5 display strings updated:
- Header: "please pay $X {tokenName}" (was "USDC")
- Testnet prompt: "Need {tokenName} on {chainName}?" (was "USDC")
- Balance: "$X {tokenName}" (was "USDC")
- Amount row: "$X {tokenName}" (was "USDC")
- Error: "Make sure you have {tokenName} on {chainName}" (was "USDC")

Regenerated Go, Python, and TS paywall templates.

* docs(evm): complete default-asset chain list in Go EVM mechanism README (x402-foundation#1998)

The Go EVM mechanism README (introduced in x402-foundation#1983) listed only 4 chains
under "Networks with default assets configured":

  - Base Mainnet, Base Sepolia, MegaETH Mainnet, Monad Mainnet

But `go/mechanisms/evm/constants.go` configures 10, and the main docs
table at `docs/core-concepts/network-and-token-support.mdx` lists all
10. Restore parity with the constants and the main docs table, in the
same order as the mdx table:

  - Base, Base Sepolia, Polygon, Arbitrum One, Arbitrum Sepolia,
    Monad, Stable, Stable Testnet, MegaETH, Mezo Testnet

All entries verified against `NetworkConfigs` in
`go/mechanisms/evm/constants.go`.

Follow-up to x402-foundation#1983 which introduced this README.

* docs(sellers): replace legacy Go import path in Echo example (x402-foundation#2009)

* Add Ultravioleta DAO facilitator to ecosystem directory (x402-foundation#1780)

- 19 mainnets across 7 blockchain families (EVM, Solana, Sui, Fogo, NEAR, Stellar, Algorand)
- 5 stablecoins: USDC, EURC, USDT, AUSD, PYUSD
- Schemes: exact, commerce, upto
- ERC-8004 reputation integration
- Production endpoint: https://facilitator.ultravioletadao.xyz

Co-authored-by: 0xultravioleta <ultravioletadao@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore(typescript): bump viem to 2.47.12 across all packages (x402-foundation#2013)

All direct viem dependencies now resolve to 2.47.12, adding chain
definitions for Mezo Testnet (31611), MegaETH (4326), Stable (988/2201),
and others that were missing from earlier locked versions.

Lockfile-only change. No package.json range changes — all existing ^2.x
ranges already accept 2.47.12.

* feat(svm): implement extra.memo support for exact scheme (x402-foundation#1688)

Implement the spec change from PR x402-foundation#1682, adding optional seller-defined
memo support to the SVM exact scheme across all three SDKs.

Client changes (TypeScript, Go, Python - both v1 and v2):
- When extra.memo is present, use its UTF-8 value as memo instruction data
- When absent, fall back to existing random 16-byte nonce behavior
- Validate memo does not exceed MAX_MEMO_BYTES (256) limit

Facilitator changes (TypeScript, Go, Python - both v1 and v2):
- When extra.memo is present in requirements, verify exactly one memo
  instruction exists and its data matches the expected value
- Return specific error codes: memo_count / memo_mismatch

Constants added:
- MAX_MEMO_BYTES / MaxMemoBytes (256) across all languages
- ERR_MEMO_MISMATCH, ERR_MEMO_COUNT (Python/Go)
- ErrMemoExceedsMaxSize (Go client)

Tests added:
- TypeScript: 4 memo tests in duplicateTx.test.ts
- Go: TestSellerMemo with 4 subtests in duplicate_tx_test.go
- Python: TestSellerMemo class with 4 tests in test_duplicate_tx.py

Closes x402-foundation#1682

* chore: version typescript packages (x402-foundation#2019)

* fix workspace settings

* fix avm/fastify changelogs

* chore: version typescript packages

* chore: version python package (x402-foundation#2020)

* chore(go): release v2.9.0 (x402-foundation#2021)

* remove old changesets

* chore(go): release v2.9.0

* Add Algorand (AVM) support to documentation (x402-foundation#1993)

* Update docs/core-concepts/network-and-token-support.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/core-concepts/network-and-token-support.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-buyers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-buyers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-buyers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/sdk-features.md

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/sdk-features.md

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>

* remove legacy examples (x402-foundation#1356)

* remove legacy examples

* add deprecation note

* Feat/add polygon facilitator (x402-foundation#2031)

* feat: add Polygon facilitator to ecosystem

Adds production-grade x402 facilitator for Polygon networks.

- URL: https://x402.polygon.technology
- Networks: polygon, polygon-amoy
- Schemes: exact
- Assets: EIP-3009
- Capabilities: verify, settle

* feat: replace polygon logo with rounded icon

* feat: update polygon facilitator with docs URL

* add upto facilitator examples (x402-foundation#2028)

* remove legacy examples (x402-foundation#2036)

* feat: add batch-settlement payment scheme and Cloudflare network specification (x402-foundation#1145)

* feat: updated legacy npm packages to deploy via trusted publishing (x402-foundation#2039)

* docs: add AI-assisted contributions guidelines and sample agent prompt (x402-foundation#1968)

Set expectations for AI-generated contributions: require human review
before requesting PR review, remove verbosity and redundancy, verify
payment/signing correctness against specs, and disclose significant AI
usage. Include a sample system prompt for AI coding agents (Claude Code,
Codex, Cursor) that aligns agent output with x402 contribution standards.

Inspired by Neovim's AI-assisted work guidelines, adapted for x402's
security-sensitive payment infrastructure context.

* feat: upto evm python (x402-foundation#2023)

* feat: add upto to python SDK

* feat: add unit & integration tests

* feat: add upto python clients/servers/facilitator to e2e suite

* initial cleanup

* implement partial settlement

* improve parity with ts/go

* better parity and fix tests

* fix(python): sort imports and format test file to pass ruff lint

New error constants were appended after ERR_UNSUPPORTED_SCHEME instead
of in alphabetical order, causing I001 (import block un-sorted).

Made-with: Cursor

* add comment to e2e tests

* fix failing integration test

* changelog

* fix changelog name

---------

Co-authored-by: Ethan Oroshiba <ethan.oroshiba@gmail.com>

* Update docs/sdk-features.md (x402-foundation#2052)

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>

* patch avm/fastify (x402-foundation#2041)

* fix: scientific notation price conversion bug (x402-foundation#2053)

* fix: scientific notation price conversion bug

* fix: simplified changeset fragment description

* fix: generalized solution

* Map simulation and settlement failures to more detailed errors (x402-foundation#2062)

* map errors

* fix ci

* update python

* fix python ci

* chore: version python package (x402-foundation#2064)

* add python upto to docs (x402-foundation#2065)

* SVM スキームの統合テスト placeholder を実テストに置換 (x402-foundation#1931)

* docs: add Documentation Checklist + surface chain-contribution flow (x402-foundation#2049)

* docs: add Documentation Checklist + surface chain-contribution flow

DEFAULT_ASSETS.md's 'Adding a New Chain' numbered flow stopped at 'Update
all three SDKs' → 'Submit a PR' and did not mention the user-facing docs
surfaces that also enumerate every chain with default-asset support. As a
result, recent onboarding PRs have shipped with stale docs (e.g. the
Radius PR x402-foundation#2038 updated the SDKs but not the docs table or Go README).
The existing Cross-SDK Checklist at the bottom enumerates only the three
code registries, mirroring the same gap.

network-and-token-support.mdx has a parallel discoverability problem:
the pointer to DEFAULT_ASSETS.md used a repo-relative path that resolves
to a broken link on docs.x402.org, and the pointer sat inside the
'Default Assets for Dollar-String Pricing' intro rather than under
'Adding Support for New Networks' where a would-be contributor actually
looks. The 'Adding' section itself described only runtime registration
(server.register from consumer code) and did not mention the separate
upstream-contribution path, and it also contained a 'Running Your Own
Facilitator' subsection that is about facilitator infrastructure, not
about adding networks — a topical mismatch. The page also ordered the
'Facilitators' section before 'Adding Support for New Networks', which
inverts the natural read → use → extend → operate narrative.

Changes:

  * DEFAULT_ASSETS.md:
      - Promote 'Update user-facing documentation' to a numbered step in
        'Adding a New Chain' (new step 3, between 'Update all three SDKs'
        and 'Submit a PR'), with a cross-reference to the new checklist.
      - Append a new 'Documentation Checklist' section below the existing
        Cross-SDK Checklist, naming the two hot docs surfaces
        (network-and-token-support.mdx and go/mechanisms/evm/README.md)
        that must also be updated on a new chain onboarding.

  * docs/core-concepts/network-and-token-support.mdx:
      - Remove the oddly-placed 'See DEFAULT_ASSETS.md' link from the
        Dollar-String Pricing intro; replace with an in-page anchor
        pointing at the new contribution subsection.
      - Split 'Adding Support for New Networks' into two subsections:
        'Runtime Registration' (the existing content, unchanged) and
        a new 'Contributing a New Default Asset' subsection that links
        to DEFAULT_ASSETS.md via an absolute github.com URL (so the
        link works on the published docs site) and explicitly names
        the cross-SDK + docs checklist.
      - Move 'Running Your Own Facilitator' out of 'Adding Support for
        New Networks' into the existing 'Facilitators' section, where
        it belongs topically.
      - Swap top-level section order: 'Adding Support for New Networks'
        now precedes 'Facilitators', matching the read → use → extend →
        operate narrative.

No code changes. Documentation only.

* docs: revert DEFAULT_ASSETS.md, unify SDK READMEs to link docs

Address review feedback: the Mintlify agent (.github/workflows/update-docs.yml)
keeps docs/ in sync with code, so contributors should only update the three SDK
constants files. Remove the Documentation Checklist and Step 3 from
DEFAULT_ASSETS.md. Apply a consistent two-link block to all three SDK READMEs
(Go/TS/Python) pointing at the mdx default-assets list and the mdx
Adding Support for New Networks section. Soften the mdx Contributing a New
Default Asset blurb to drop manual mdx/README update instructions.

* feat: add Quicknode to adopted-by scroller (x402-foundation#2055)

* fix(go): implement SupportedCache Clear (x402-foundation#2072)

* docs: create `README.md` under `typescript/` to showcase list of available packages (x402-foundation#1978)

* docs: add npm badge with package version (Typescript + Chains)

* docs: create `README.md` under `typescript/` with full list of available packages

* docs: improve top README for installation instructions per language

* docs: separate code inputs to enable to copy / paste easily

* docs: add missing packages in installation command

* docs: break down and group package installation list for readability

* docs: add badges for packages around Algorand and Fastify

---------

Co-authored-by: Carson Roscoe <CarsonRoscoe7@gmail.com>
Co-authored-by: caveman.eth <24273561+caveman-eth@users.noreply.github.com>
Co-authored-by: scaler <240590331+sc4l3r@users.noreply.github.com>
Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
Co-authored-by: Philippe d'Argent <p.dargent@cern.ch>
Co-authored-by: Andrew Reder <avidreder@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Ash <105402607+Must-be-Ash@users.noreply.github.com>
Co-authored-by: MG <emg110@gmail.com>
Co-authored-by: Ryan R. Fox <ryanRfox@users.noreply.github.com>
Co-authored-by: Andrew Barnes <bortstheboat@gmail.com>
Co-authored-by: VIkions <99107287+vikions@users.noreply.github.com>
Co-authored-by: 0xultravioleta <0xultravioleta@gmail.com>
Co-authored-by: 0xultravioleta <ultravioletadao@gmail.com>
Co-authored-by: Misha Kolesnik <tenequm@gmail.com>
Co-authored-by: AkshatGada <96907514+AkshatGada@users.noreply.github.com>
Co-authored-by: Cameron Whiteside <35665916+CameronWhiteside@users.noreply.github.com>
Co-authored-by: Notorious D.E.V. <notoriousd3v@gmail.com>
Co-authored-by: Natsuki Yamaguchi <natsukingly@gmail.com>
Co-authored-by: Sahil sen <sensahil25@gmail.com>
Co-authored-by: GrishaG <118081038+viktorcrypt@users.noreply.github.com>
Co-authored-by: Jean Cvllr <31145285+CJ42@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

sdk Changes to core v2 packages typescript

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants